#==============================================================================
# Plik Makefil - wzór prof. W. Płaczek, dalsze modyfikacje Marcin Abram.
#==============================================================================
.SUFFIXES: .c .cpp .o .x .h
#==============================================================================
# MAKRA
#------------------------------------------------------------------------------
# Nazwa katalogu
DIR = mros
# Nazwy programow wykonywalnych
NAME00 = jk
NAME01 = yyt05
EXEC00 = $(NAME00).x
EXEC01 = $(NAME01).x
OBJS00 = $(NAME00).o
OBJS01 = $(NAME01).o
# Nazwy plikow skladowych dla biblioteki opakowujacej wywolania GSL
LIBNAMEGSL = supToGSL
LIBHEADGSL = $(LIBNAMEGSL).h
LIBOBJSGSL = $(LIBNAMEGSL).o
# Nazwy plikow skladowych dla biblioteki opakowujacej watki
LIBNAMETHR = thread
LIBHEADTHR = $(LIBNAMETHR).h
LIBOBJSTHR = $(LIBNAMETHR).o
# Nazwy plikow skladowych dla biblioteki testow jk
LIBNAMEJK1 = jkClass
LIBNAMEJK2 = jkFunc
LIBHEADSJK1 = $(LIBNAMEJK1).h
LIBHEADSJK2 = $(LIBNAMEJK2).h
LIBOBJSJK1 = $(LIBNAMEJK1).o
LIBOBJSJK2 = $(LIBNAMEJK2).o
# Nazwy plikow skladowych dla biblioteki testow yyt05
LIBNAMEYYT1 = yyt05Funcs
LIBNAMEYYT2 = yyt05Set
LIBHEADSYYT1 = $(LIBNAMEYYT1).h
LIBHEADSYYT2 = $(LIBNAMEYYT2).h
LIBOBJSYYT1 = $(LIBNAMEYYT1).o
LIBOBJSYYT2 = $(LIBNAMEYYT2).o
# Pliki naglowkowe
SUPP01 = constants.h
SUPP02 = colorText.h
#==============================================================================
# Opcje kompilatora i linkera
#------------------------------------------------------------------------------
CFLAGS = -Wall -O2 -I/usr/include -std=c++0x
LFLAGS = -Wall -O2 -I/usr/include -std=c++0x
# Biblioteki linkera zainstalowane w systemie
# (tu: biblioteka matematyczna libm i GSL)
LIBS = -lgsl -lgslcblas -lm -lpthread
CO = c++
LD = $(CO)
# Program-archiwizer do tworzenia bibliotek statycznych
AR = ar
# Opcje archiwizera: uaktualnianie biblioteki i wypisywanie komunikatow 
ARFLAGS = rv
#==============================================================================
# Tworze statyczna biblioteke, cz. 1
#------------------------------------------------------------------------------
LIB_NAME_GSL = gsl
LIB_STAT_GSL = lib$(LIB_NAME_GSL).a
LIB_OBJS_GSL = $(LIBOBJSGSL)

LIB_NAME_THR = thread
LIB_STAT_THR = lib$(LIB_NAME_THR).a
LIB_OBJS_THR = $(LIBOBJSTHR)

LIB_NAME_JK = jk
LIB_STAT_JK = lib$(LIB_NAME_JK).a
LIB_OBJS_JK = $(LIBOBJSJK1) $(LIBOBJSJK2)

LIB_NAME_YYT = yyt
LIB_STAT_YYT = lib$(LIB_NAME_YYT).a
LIB_OBJS_YYT = $(LIBOBJSYYT1) $(LIBOBJSYYT2)
###############################################################################
# Reguly zaleznosci
#------------------------------------------------------------------------------
# Tzw. regula wzorcowa - mowiaca jak pliki z rozszerzeniem .o otrzymac 
# z plikow o rozszerzeniach .cpp i .h. 
%.o: %.cpp %.h
	$(CO) $(CFLAGS) -c $<
# Jak wyzej, ale bez zaleznosci od plikow naglowkowych
%.o: %.cpp
	$(CO) $(CFLAGS) -c $<
#------------------------------------------------------------------------------
# Regula zaleznosci - uaktualnij pliki po prawej stronie dwukropka.
.PHONY: all
all: $(EXEC00) $(EXEC01)
$(EXEC00): $(OBJS00) $(LIB_STAT_GSL) $(LIB_STAT_JK) $(LIB_STAT_THR)
		$(LD) -o $@ $(LFLAGS) $^ $(LIBS)
$(EXEC01): $(OBJS01) $(LIB_STAT_GSL) $(LIB_STAT_YYT) $(LIB_STAT_THR)
		$(LD) -o $@ $(LFLAGS) $^ $(LIBS)
#==============================================================================
# Tworze statyczna biblioteke, cz. 2
#------------------------------------------------------------------------------
# Tworzenie bibliteki statycznej dla 2. i 3. programu przy pomocy
# programu archiwizujacego. Zmienna automatyczne $? oznacza wszystkie
# prerekwizyty, ktore sa nowsze niz cel (dzieki temu tylko zmodyfikowane
# pliki bede wstawiane do biblioteki-archiwum).
$(LIB_STAT_GSL): $(LIB_OBJS_GSL)
	$(AR) $(ARFLAGS) $@ $?
$(LIB_STAT_THR): $(LIB_OBJS_THR)
	$(AR) $(ARFLAGS) $@ $?
$(LIB_STAT_JK): $(LIB_OBJS_JK)
	$(AR) $(ARFLAGS) $@ $?
$(LIB_STAT_YYT): $(LIB_OBJS_YYT)
	$(AR) $(ARFLAGS) $@ $?
#==============================================================================
# Dodatkowe reguly zaleznosci plikow objectowych od naglowkowych, ktorych
# nie uwglednia regula wzorcowa (powyzej).
$(OBJS00): $(SUPP01) $(SUPP02)
$(OBJS01): $(SUPP0y1) $(SUPP02)
$(LIB_OBJS_GSL): $(SUPP01) $(SUPP02) $(LIBHEADGSL)
$(LIB_OBJS_THR): $(SUPP01) $(SUPP02) $(LIBHEADTHR)
$(LIB_OBJS_JK): $(SUPP01) $(SUPP02) $(LIBHEADSJK1) $(LIBHEADSJK2)
$(LIB_OBJS_YYt): $(SUPP01) $(SUPP02) $(LIBHEADSYYT1) $(LIBHEADSYYT2)
###############################################################################
# Uruchamianie z uzyciem biblioteki dzielonej
.PHONY: runjk runyyt
#------------------------------------------------------------------------------
runjk: $(EXEC00)
	(cd ..; src/$(EXEC00) )
runyyt: $(EXEC01)
	(cd ..; src/$(EXEC01) )
###############################################################################
.PHONY: clean tar stat
clean:                                                     
	rm -f *.o  *~ *.a *.so *.x core core* a.out $(EXEC00) $(EXEC01)
# Archiwizacja i kompresja
tar: clean
	(cd ../../; tar -cvzf $(DIR).tar.gz  $(DIR) )
# statystyka wypoconych 
# linii i znakow kodu :P
stat:
	wc *.h *.cpp
###############################################################################
# KRÓTKI HELP
#------------------------------------------------------------------------------
# Budowa:
# 	CEL: SKŁADNIKI
#	[TAB] KOMENDA
#------------------------------------------------------------------------------
# Zmienne automatyczne:
#  < - aktualnie przetwarzany plik z listy składników (patrz przykład)
#  @ - nazwa pliku docelowego
#  ^ - składniki 
#------------------------------------------------------------------------------
